from django.shortcuts import render
from django.views import View
from django import http
import logging
from django.core.cache import cache

from apps.areas.models import Area
from meiduo_mall.utils.response_code import RETCODE
# Create your views here.


# 日志记录器
logger = logging.getLogger('django')


class AreasView(View):
    """省市区"""

    def get(self, request):
        """查询省市区数据"""
        # 接收参数
        area_id = request.GET.get('area_id')

        # 判断area_id是否存在
        if not area_id:
            # 在哪里读取缓存数据？查询数据之前
            # cache存储的是什么，读取出来的也是什么，类型不变
            province_list = cache.get('province_list')
            if province_list:
                # 响应JSON数据：JsonResponse不识别模型数据，他只识别字典、列表、字典列表
                return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'province_list': province_list})

            # 查询省份数据：省份没有父级
            try:
                province_model_list = Area.objects.filter(parent=None)
            except Exception as e:
                logger.error(e)
                return http.JsonResponse({'code': RETCODE.DBERR, 'errmsg': '省份数据错误'})
            else:
                # 模型列表转字典列表(非常重要，也叫序列化，将一种数据格式转换为另外一种都叫做序列化)
                # 项目二中，有百分之八十都是在模型列表转字典列表的序列化（DRF）
                province_list = []
                for province_model in province_model_list:
                    province_dict = {
                        "id": province_model.id,
                        "name": province_model.name
                    }
                    province_list.append(province_dict)

                # 保存省份的代码写在哪儿？写在查询省份之后
                # 保存哪些省份数据？province_list
                cache.set('province_list', province_list, 3600)

                # 响应JSON数据：JsonResponse不识别模型数据，他只识别字典、列表、字典列表
                return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'province_list': province_list})
        else:
            # 查询市区数据
                # 如果area_id是省份ID，那么就要省份对应的城市
                # 如果area_id是城市ID，那么就要城市对应的区县
            # 查询缓存
            # sub_area = cache.get('sub_area_%s' % parent_model.id)
            sub_area = cache.get('sub_area_%s' % area_id)
            if sub_area:
                return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'sub_area': sub_area})

            try:
                # 查询area_id对应的上级地区数据
                parent_model = Area.objects.get(id=area_id)
                # 使用上级找子级：省找市，市找区 (一查多：一方模型对象.关联字段)
                sub_model_list = parent_model.subs.all()
            except Exception as e:
                logger.error(e)
                return http.JsonResponse({'code': RETCODE.DBERR, 'errmsg': '市区数据错误'})
            else:
                # 构造子级数据
                sub_list = []
                for sub_model in sub_model_list:
                    sub_dict = {
                        "id": sub_model.id,
                        "name": sub_model.name
                    }
                    sub_list.append(sub_dict)

                sub_area = {
                    "id": parent_model.id, # 上级地区ID
                    "name": parent_model.name, # 上级地区名称
                    "subs": sub_list # 子级数据字典列表
                }

                # 缓存市区数据:需要唯一标识这个子级是谁的子级，比如需要唯一标识这个是河北省的城市
                cache.set('sub_area_%s' % parent_model.id, sub_area, 3600)

                # 响应JSON数据
                return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'sub_area': sub_area})